package net.slavics.maps.impl;

import java.awt.Point;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import net.slavics.maps.ifc.IGeoTransfer;
import org.apache.log4j.Logger;

/**
 * Linearní závislost vstupu a výstupu
 * @author slavic01
 * @version $Revision: 19 $
 * $LastChangedDate: 2008-04-30 08:42:28 +0000 (Wed, 30 Apr 2008) $ $Author: pslavicek@seznam.cz $
 */
public abstract class LineGeoTransfer implements IGeoTransfer {

    private static Logger _log = Logger.getLogger(LineGeoTransfer.class);
    protected double ax = 1,  bx = 0,  ay = 1,  by = 0;
    private String name = String.valueOf(this.hashCode());

    /**
     * Linearní závislost vstupu a výstupu
     * Multiplikátor ax, ay = 1, konstanty bx, by = 0;
     */
    public LineGeoTransfer() {
    }

    /**
     * Linearní závislost vstupu a výstupu
     * 
     * Nastavení 
     * @param ax Multiplikátor X
     * @param bx Konstanta X
     * @param ay Multiplikátor Y
     * @param by Konstanta Y
     */
    public LineGeoTransfer(double ax, double bx, double ay, double by) {
        this.ax = ax;
        this.bx = bx;
        this.ay = ay;
        this.by = by;
        this.name = ax + "(x)+" + bx + " , " + ay + "(y)+" + by;
    }

    /**
     * Lineárně posune souřadnice X a Y
     * @param input 
     * @return
     */
    public Point transfer(Point input) {
        return new Point((int) (ax * input.x + bx), (int) (ay * input.y + by));
    }

    @Override
    public String toString() {
        return name;
    }

    public File getFile(Point sektor) {
        return new File(String.format("%s.%s.png", toHex(sektor.x), toHex(sektor.y)));
    }

    public URL getUrl(Point sektor) throws MalformedURLException {
        throw new UnsupportedOperationException("Nepřekryto");
    }

    /**
     * Převede dekadické číslo na hexadecimální
     * @param number
     * @return 8-místný hexadecimální řetězec
     */
    public static String toHex(int number) {
        return String.format("%8s", Integer.toHexString(number)).replace(' ', '0').toUpperCase();
    }
}
